package com.gjt.http;

import java.net.*;
import java.util.List;

/**
 * Created with Intel IDEA.
 * Http 协议 ：
 *           客户端到服务器的每一个请求都有四个步骤
 *              1：默认情况下客户端在端口80 打开与服务器的一个tcp 连接，URL中还可以指定其他端口
 *              2：客户端向服务器发送消息，请求指定路径上的资源，请求包含首部，可选的，空行，请求体
 *              3：服务器向客户端发送响应。响应以响应码开头，元数据的首部，空行，请求的文档或错误信息
 *              4：服务器关闭连接
 *
 *            http组成
 *
 *                方法（get,post,put,delete）   查询路径   http的版本   这一行成为请求行
 *                GET /index.html HTTP1.1
 *
 *                User-Agent说明你是用的什么浏览器
 *                User-Agent: LYNX/2.4 libwww/2.1.5
 *
 *                时间
 *                Date: Sun, 21 Apr 2013 15:12:22 GMT
 *                主机名
 *                Host: www.baidu.com
 *
 *                http1.1 会为每个请求打开一个新的连接，1.1 之后服务器在发送响应后可以保持连接等待同一个socket的请求（false 不开启）
 *                Connection: keep-alive
 *                接收的语言
 *                Accept-Language: en-US,en;q=0.5
 *                接收的编码格式
 *                Accept-Encoding: gzip, deflate
 *
 *                告诉服务器前端可以处理的数据类型  MIME媒体类型有(html文档，纯文本，JPEG，GIF图片)text/html，text/plain, image/gif, image/jpeg
 *                MIME媒体类型 分为两级 类型（type）和子类型（subtype）
 *                8种顶级类型： text/*: 表示人可读的文字； image/*: 图片； model/*:3D模型，如VRML文件； audio/*: 声音
 *                            video/*: 移动的图片，包括声音； application/*: 二进制数据； message/*:协议特定的信封，如email消息和HTTP响应
 *                            multipart/*: 表示多个文档和资源的容器
 *                Accept: text/html, image/gif*
 *                Content-Type: application/atom+xml;type=entry
 *
 *                消息体的长度
 *                Content-Length: 332
 *
 *
 *                设置Cookie cart=123 这个键值对自定义的    Domain=.foo.com;控制cookie的作用域，例如浏览器会把这个cookie会送到www.foo.com
 *                还会发送到他下边的子网（a.foo.com;b.foo.com）,但不会发送到（www.a.com）;  Path=/user: 改变默认的作用域，它只应用于服务器的/user
 *                的子树，而不能应用于网站的其他部分； 这个Domain和Path 解释为cookie应用于foo.com域种的任何服务器的/user路径；
 *                expires: 表示cookie什么时候过期  Max-age: 表示过多长时间cookie过期 ；
 *                secure:代表这个cookie事务是安全的    httponly:代表提高cookie窃取性;告诉浏览器只通过http和https返回cookie
 *                Set-Cookie: cart= 123; Path=/user; Domain=.foo.com; expires= Sun, 21 Apr 2013 15:12:22 GMT;
 *                             Max-age= 3600; secure; httponly
 *
 *                http主体
 *                username=Elliotte+Haor
 *
 * Cookie 类
 *
 * @Auther: gjt
 * @Date: 2024/3/23 19:54
 */
public class HttpCookies implements CookiePolicy{
    public static void main(String[] args) throws URISyntaxException {
        // 抽象类CookieHandler定义了存储和获取cookie的api  子类CookieManager 这两行代码作用：你用URL类连接的Http服务器，java 会存储
        //   服务器发送的所有cookie
        CookieManager cookieManager = new CookieManager();
        // 设置只接受与你对话的服务器发送的cookie
        cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER);
        CookieHandler.setDefault(cookieManager);

        // 获取cookie库
        CookieStore cookieStore = cookieManager.getCookieStore();
        // 增加cookie
        cookieStore.add(new URI("http://gjt1314.xyz"),new HttpCookie("cart","123"));
        // 获取指定cookie
        cookieStore.get(new URI("http://gjt1314.xyz"));
        // 获取库中所有cookie
        List<HttpCookie> cookies = cookieStore.getCookies();
        // 获取库中所有URI
        List<URI> urIs = cookieStore.getURIs();
        // 删除指定cookie
        cookieStore.remove(new URI("http://gjt1314.xyz"),new HttpCookie("cart","123"));
        // 删除库中所有cookie
        cookieStore.removeAll();
    }

    // 接收某些已知域的cookie 实现CookiePolicy接口   阻塞所有.gov的cookie
    @Override
    public boolean shouldAccept(URI uri, HttpCookie cookie) {
        return !uri.getAuthority().toLowerCase().endsWith(".gov")
                && !cookie.getDomain().toLowerCase().endsWith(".gov");
    }
}
